package com.yimi.flutter.plugin.flutter_plugin_baidu.service;

import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
import android.os.Bundle;
import android.util.Log;

import com.baidu.tts.chainofresponsibility.logger.LoggerProxy;
import com.baidu.tts.client.SpeechError;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.SpeechSynthesizerListener;
import com.baidu.tts.client.TtsMode;
import com.yimi.flutter.plugin.flutter_plugin_baidu.constant.PluginKey;
import com.yimi.flutter.plugin.flutter_plugin_baidu.constant.ThirdConstant;
import com.yimi.flutter.plugin.flutter_plugin_baidu.speech.AutoCheck;
import com.yimi.flutter.plugin.flutter_plugin_baidu.speech.InitConfig;

import java.util.HashMap;
import java.util.Map;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.JobIntentService;

/**
 * Created by 000098 on 2019/4/17。
 * Description 语音播报的服务
 *
 * @author 000098
 */
public class SpeechIntentService extends JobIntentService {
    //播放的内容
    String str = "";
    private static final String TAG = "SpeechIntentService";
    /**
     * 这个Service 唯一的id
     */
    static final int JOB_ID = 10111;

    // TtsMode.MIX; 离在线融合，在线优先； TtsMode.ONLINE 纯在线； 没有纯离线
    private TtsMode ttsMode = TtsMode.ONLINE;
    // ===============初始化参数设置完毕，更多合成参数请至getParams()方法中设置 =================

    protected SpeechSynthesizer mSpeechSynthesizer;


    /**
     * sharedPreferences工具类.
     */
//    protected SharedPrefGlobal mPrefGlobal;

    /**
     * Convenience method for enqueuing work in to this service.
     */
    public static void enqueueWork(Context context, Intent work) {
        enqueueWork(context, SpeechIntentService.class, JOB_ID, work);
    }

    @Override
    protected void onHandleWork(@NonNull Intent intent) {
        onHandleIntent(intent);
    }


    protected void onHandleIntent(@Nullable Intent intent) {
        Bundle extras = intent.getExtras();
        //如果正在录音，则取消语音播放
//        mPrefGlobal = new SharedPrefGlobal.Builder().setFileName(GlobalKey.FILE_USER).create(this);
//        boolean voiceStart = mPrefGlobal.get(GlobalKey.VOICE_START, false);
//        if (voiceStart) {
//            return;
//        }
        str = extras.getString(PluginKey.SPEECHKEY, "");
        //初始化配置，停止播放
        initTTs();

        //播放特定的语音后，需要录音反馈。 所以停止其他的语音播报
//        if (VoiceConstant.VOICE_STOP.equals(str)) {
//            //收到“stop”指令，停止所有语音播放，录音开始 (直接返回)
//            mPrefGlobal.put(GlobalKey.VOICE_START, true);
//            return;
//        }
//        if (VoiceConstant.VOICE_CLOCK.equals(str)) {
//            //收到 “打卡”指令，停止其他语音播放，录音开始 （待打卡）
//            mPrefGlobal.put(GlobalKey.VOICE_START, true);
//        }
//        //保存 tts的内容
//        mPrefGlobal.put(GlobalKey.TTS_CONTENT, str);

        speak();

    }
    /**
     * 注意此处为了说明流程，故意在UI线程中调用。
     * 实际集成中，该方法一定在新线程中调用，并且该线程不能结束。具体可以参考NonBlockSyntherizer的写法
     */
    private void initTTs() {
        LoggerProxy.printable(true); // 日志打印在logcat中
        // 1. 获取实例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        mSpeechSynthesizer.setContext(this);
        //设置监听
        setListener();
        // 3. 设置appId，appKey.secretKey
        int result = mSpeechSynthesizer.setAppId(ThirdConstant.baidu_appId);
        checkResult(result, "setAppId");
        result = mSpeechSynthesizer.setApiKey(ThirdConstant.baidu_appKey, ThirdConstant.baidu_secretKey);
        checkResult(result, "setApiKey");

        // 5. 以下setParam 参数选填。不填写则默认值生效
        // 设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
        // 设置合成的音量，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
        // 设置合成的语速，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");
        // 设置合成的语调，0-9 ，默认 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");

        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
        // 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。
        // MIX_MODE_DEFAULT 默认 ，wifi状态下使用在线，非wifi离线。在线状态下，请求超时6s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线，非wifi离线。在线状态下， 请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_NETWORK ， 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线

        mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);

        // x. 额外 ： 自动so文件是否复制正确及上面设置的参数
        Map<String, String> params = new HashMap<>();
        // 复制下上面的 mSpeechSynthesizer.setParam参数
        InitConfig initConfig =  new InitConfig(ThirdConstant.baidu_appId, ThirdConstant.baidu_appKey, ThirdConstant.baidu_secretKey, ttsMode, params);

        AutoCheck.getInstance(this.getApplicationContext()).check(initConfig);
        // 6. 初始化
        result = mSpeechSynthesizer.initTts(ttsMode);
        checkResult(result, "initTts");

        //播放前，先停止播放
        stop();
    }

    private void speak() {

        /* 以下参数每次合成时都可以修改
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
         *  设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "5"); 设置合成的音量，0-9 ，默认 5
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5"); 设置合成的语速，0-9 ，默认 5
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5"); 设置合成的语调，0-9 ，默认 5
         *
         *  mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);
         *  MIX_MODE_DEFAULT 默认 ，wifi状态下使用在线，非wifi离线。在线状态下，请求超时6s自动转离线
         *  MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线，非wifi离线。在线状态下， 请求超时1.2s自动转离线
         *  MIX_MODE_HIGH_SPEED_NETWORK ， 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
         *  MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
         */

        if (mSpeechSynthesizer == null) {
            print(TAG+ " [ERROR], 初始化失败");
            return;
        }
        if ("".equals(str)) {
            return;
        }
        int result = mSpeechSynthesizer.speak(str);
        checkResult(result, "speak");

        //释放资源
//        if (mSpeechSynthesizer != null) {
//            mSpeechSynthesizer.stop();
//            mSpeechSynthesizer.release();
//            mSpeechSynthesizer = null;
//            print("释放资源成功");
//        }
        print(TAG+ " 合成并播放 按钮已经点击");
    }

    private void stop() {
        print(TAG + " 停止合成引擎 按钮已经点击");
        int result = mSpeechSynthesizer.stop();
        checkResult(result, "stop");
    }

    private void print(String message) {
        Log.e(TAG, message);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    private void checkResult(int result, String method) {
        if (result != 0) {
            print(TAG + " error code :" + result + " method:" + method + ", 错误码文档:http://yuyin.baidu.com/docs/tts/122 ");
        }
    }

    private void setListener() {
        mSpeechSynthesizer.setSpeechSynthesizerListener(new SpeechSynthesizerListener() {
            @Override
            public void onSynthesizeStart(String s) {
                
            }

            @Override
            public void onSynthesizeDataArrived(String s, byte[] bytes, int i, int i1) {

            }

            @Override
            public void onSynthesizeFinish(String s) {

            }

            @Override
            public void onSpeechStart(String s) {

            }

            @Override
            public void onSpeechProgressChanged(String s, int i) {

            }

            @Override
            public void onSpeechFinish(String s) {

            }

            @Override
            public void onError(String s, SpeechError speechError) {

            }
        });
    }

}
